package demo8

import (
	"fmt"
	"time"
)

/*
	Go语言中的 time 包提供了计时器的封装。
	1. 由于 Go语言中的通道和 goroutine 的设计，定时任务可以在 goroutine 中通过同步的方式完成，
		也可以通过在 goroutine 中异步回调完成。
	2. 这里将分两种用法进行例子展示。
*/

// TestDemo813 使用通道响应计时器的事件, 一段时间之后（time.After）
func TestDemo813() {
	// 声明一个退出用的通道，往这个通道里写数据表示退出。
	exit := make(chan int)

	// 打印开始
	fmt.Println("start")

	// 过 1s 后，调用匿名函数
	// 	调用 time.AfterFunc() 函数，传入等待的时间和一个回调。
	//	回调使用一个匿名函数，在时间到达后，匿名函数会在另外一个 goroutine 中被调用。
	time.AfterFunc(time.Second, func() {
		// 过 1s 后，打印结果
		fmt.Println("one second after")

		// 通知 main 函数的 goroutine 结束
		// 任务完成后，往退出通道中写入数值表示需要退出。
		exit <- 0
	})

	// 等待结束
	// 运行到此处时持续阻塞，直到 1 秒后第 22 行被执行后结束阻塞。
	<-exit
}
